﻿using System;
using YookingCrypto.Class;
using YookingFileIO.Class;
using YookingBizWQW.Class.Public;
using YookingInterfaceCredit.Class.XinZhiDui;

namespace YookingBizWQW.Class.Credit.pc
{
    public class clsInterfaceXzd
    {
        #region 实时接口：会员注册与修改，获取会员编号（商户号）信息

        //注释：王庆文 2020年12月08日================================================================
        //将持卡人的借记卡卡号、身份证号、姓名、手机号等信息提交给信之队API接口，进行会员登记及注册
        public string CommitXzdRegister(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来
      
            string strUnitCode = "CHN000"; //平台单位编码
            string strPersonCode = "0000"; //用户人员编码

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 2)
            {
                strUnitCode = strArray[0];
                strPersonCode = strArray[1];
            }

            #endregion

            clsRegMember myXzd = new clsRegMember(); //实例化类库
            strRtData = myXzd.CommitXzdRegister(strUnitCode, strPersonCode);

            return strRtData; //接口调用得到的应答结果
        }

        #endregion

        #region 实时接口：银行卡绑定类接口（四个），接收短信验证码、提交短信验证码、查询卡是否已经开通、解除绑定

        //注释：王庆文 2020年12月10日===========================================================================
        //由支付接口向持卡人的手机发送一条验证码短信，申请绑定信用卡
        public string sendSms2BindPrepare(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUnitCode = "CHN000"; //平台单位编码
            string strPersonCode = "0000"; //用户人员编码
            string strCardNo = "00000000"; //银行卡卡号
            string strInterUse = "POS";    //支付通道接口用途

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 4)
            {
                strUnitCode = strArray[0];
                strPersonCode = strArray[1];
                strCardNo = strArray[2];
                strInterUse = strArray[3];
            }

            #endregion

            clsBindCard myXzd = new clsBindCard(); //实例化类库
            strRtData = myXzd.sendSms2BindPrepare(strInterUse, strUnitCode, strPersonCode, strCardNo);

            return strRtData; //接口调用得到的应答结果
        }

        //注释：王庆文 2020年12月10日============================================================================
        //持卡人在手机APP端输入短信验证码之后，YOOKING将该验证码提交给接口进行检查和确认，通过则绑卡成功
        public string checkSms2BindConfirm(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUnitCode = "CHN000"; //平台单位编码
            string strPersonCode = "0000"; //用户人员编码
            string strCardNo = "00000000"; //银行卡卡号
            string strInterUse = "POS";    //支付通道接口用途
            string strSmsCode = "ASWdew";  //客户手机收到的短信验证码

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 5)
            {
                strUnitCode = strArray[0];
                strPersonCode = strArray[1];
                strCardNo = strArray[2];
                strInterUse = strArray[3];
                strSmsCode = strArray[4];
            }

            #endregion

            clsBindCard myXzd = new clsBindCard(); //实例化类库
            strRtData = myXzd.checkSms2BindConfirm(strInterUse, strUnitCode, strPersonCode, strCardNo, strSmsCode);

            return strRtData; //接口调用得到的应答结果
        }

        //注释：王庆文 2020年12月10日=================================================================
        //查询指定卡号的银行卡是否已经开通并绑卡，避免重复发送绑卡短信
        public string queryBindStatus(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUnitCode = "CHN000"; //平台单位编码
            string strPersonCode = "0000"; //用户人员编码
            string strCardNo = "00000000"; //银行卡卡号
            string strInterUse = "POS";    //支付通道接口用途

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 4)
            {
                strUnitCode = strArray[0];
                strPersonCode = strArray[1];
                strCardNo = strArray[2];
                strInterUse = strArray[3];
            }

            #endregion

            clsBindCard myXzd = new clsBindCard(); //实例化类库
            strRtData = myXzd.queryBindStatus(strInterUse, strUnitCode, strPersonCode, strCardNo);

            return strRtData; //接口调用得到的应答结果
        }

        //注释：王庆文 2020年12月10日================================================================
        //解除指定卡号的信用卡的签约绑定状态，信用卡解绑
        public string unBindBankCard(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUnitCode = "CHN000"; //平台单位编码
            string strPersonCode = "0000"; //用户人员编码
            string strCardNo = "00000000"; //银行卡卡号
            string strInterUse = "POS";    //支付通道接口用途

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 4)
            {
                strUnitCode = strArray[0];
                strPersonCode = strArray[1];
                strCardNo = strArray[2];
                strInterUse = strArray[3];
            }

            #endregion

            clsBindCard myXzd = new clsBindCard(); //实例化类库
            strRtData = myXzd.unBindBankCard(strInterUse, strUnitCode, strPersonCode, strCardNo);

            return strRtData; //接口调用得到的应答结果
        }

        #endregion

        #region 实时接口：信用卡ATM套现下单、确认接口程序（两个）

        //注释：王庆文 2020年12月10日================================================================================
        //持卡人在手机APP端操作进行套现下单操作，提交接口申请同名快捷下单交易，实时交易
        public string ATMOrderCommit(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUnitCode = "CHN000"; //平台单位编码
            string strPersonCode = "0000"; //用户人员编码
            string strPlanID = "00000000"; //套现计划ID

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 3)
            {
                strUnitCode = strArray[0];
                strPersonCode = strArray[1];
                strPlanID = strArray[2];
            }

            #endregion

            clsCreditATM myXzd = new clsCreditATM(); //实例化类库
            strRtData = myXzd.ATMOrderCommit(strUnitCode, strPersonCode, strPlanID);

            return strRtData; //接口调用得到的应答结果
        }

        //注释：王庆文 2020年12月10日==========================================================================
        //持卡人在手机APP端收到套现短信之后，输入短信验证码，提交给API接口确认本次交易
        public string ATMOrderConfirm(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUnitCode = "CHN00000000000"; //平台单位编码
            string strPlanID = "0000000000000000"; //套现计划ID
            string strTrade_Sys_RecordID = "0000"; //交易记录ID
            string strMerchantNo = "000000000000"; //会员标识号
            string strOrderNo = "000000000000000"; //交易订单号
            string strSmsCode = "000000000000000"; //APP端输入的短信验证码

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 6)
            {
                strUnitCode = strArray[0];
                strPlanID = strArray[1];
                strTrade_Sys_RecordID = strArray[2];
                strMerchantNo = strArray[3];
                strOrderNo = strArray[4];
                strSmsCode = strArray[5];
            }

            #endregion

            clsCreditATM myXzd = new clsCreditATM(); //实例化类库
            strRtData = myXzd.ATMOrderConfirm(strUnitCode, strPlanID, strTrade_Sys_RecordID, strMerchantNo, strOrderNo, strSmsCode);

            return strRtData; //接口调用得到的应答结果
        }

        #endregion

        #region 任务轮询接口：批量注册信之队储蓄卡会员

        //注释：王庆文 2020年12月12日=========================================================================
        //解决历史遗留问题，之前丰付接口没有注册过信之队会员的所有记录，批量注册一下
        public string XzdBatchRegister(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strTempParam = "AABB"; //随便设置的临时参数

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strTempParam = strArray[0];
            }

            #endregion

            //进行批量注册操作
            clsRegMember myXzd = new clsRegMember(); 
            strRtData = myXzd.XzdBatchRegister();

            return strRtData; //接口调用得到的应答结果
        }

        #endregion

        #region 任务轮询接口：信用卡POS代还业务接口（两个），代付刷卡、代付还款

        #region 信用卡POS01刷卡接口对接轮询程序

        //注释：王庆文 2020年12月11日================================================================================
        //查询订单交易情况登记表(XYK_TradeOrder)，将还没有交易过的符合时间条件的
        //刷卡订单全部查询出来，提交给信之队的支付接口进行信用卡刷卡的实时交易。
        //TradeType：POS01=信用卡刷卡、POS02=信用卡还款、ATM01=信用卡套刷、ATM02=信用卡套入、
        //HBEI01=花呗消费、HBEI02=花呗还款、BKGE01=佣金提现、HYCZ01=会员充值
        public string POSOrder_ShuaKa(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            //默认轮询间隔时间（秒）
            string strSecondNumber = "3600";

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strSecondNumber = strArray[0];
            }

            #endregion

            //先批量查询一下之前接口调用的各条订单的异步执行状态
            clsCreditQuery myQuery = new clsCreditQuery();
            string strQueryResult = myQuery.QueryOrderStatus_UpdateBizData();

            //信之队接口只有早上07:00至晚上22:00之间才提供对接服务
            string strCurTime = DateTime.Now.ToString("HH:mm:ss");
            if (strCurTime.CompareTo("07:00:00") > 0
                && strCurTime.CompareTo("22:00:00") < 0)
            {
                //按照计划预设的时间要求，调用信之队接口进行批量刷卡操作
                clsCreditPOS myPos = new clsCreditPOS();
                int iSecondNumber = Convert.ToInt32(strSecondNumber);
                strRtData = myPos.POSOrder_ShuaKa(iSecondNumber);
            }

            return strQueryResult + strRtData; //接口调用得到的应答结果
        }

        #endregion

        #region 信用卡POS02还款接口对接轮询程序

        //注释：王庆文 2020年12月11日================================================================================
        //查询订单交易情况登记表(XYK_TradeOrder)，将还没有交易过的符合时间条件的
        //还款订单全部查询出来，提交给丰付的支付接口进行信用卡还款交易操作。
        //TradeType：POS01=信用卡刷卡、POS02=信用卡还款、ATM01=信用卡套刷、ATM02=信用卡套入、
        //HBEI01=花呗消费、HBEI02=花呗还款、BKGE01=佣金提现、HYCZ01=会员充值
        public string POSOrder_HuanKuan(string strB64RequestData)
        {
            string strRtData = "{\"result\":\"yooking null\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            //默认轮询间隔时间（秒）
            string strSecondNumber = "3600";

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 1)
            {
                strSecondNumber = strArray[0];
            }

            #endregion

            //先批量查询一下之前接口调用的各条订单的异步执行状态
            clsCreditQuery myQuery = new clsCreditQuery();
            string strQueryResult = myQuery.QueryOrderStatus_UpdateBizData();

            //丰付接口只有早上07:00至晚上22:00之间才提供对接服务
            string strCurTime = DateTime.Now.ToString("HH:mm:ss");
            if (strCurTime.CompareTo("07:00:00") > 0
                && strCurTime.CompareTo("22:00:00") < 0)
            {
                //按照计划预设的时间要求，调用丰付接口进行批量还款操作
                clsCreditPOS myPos = new clsCreditPOS();
                int iSecondNumber = Convert.ToInt32(strSecondNumber);
                strRtData = myPos.POSOrder_HuanKuan(iSecondNumber);
            }

            return strQueryResult + strRtData; //接口调用得到的应答结果
        }

        #endregion

        #endregion

        #region 查询指定号码的信用卡在支付通道端虚拟账户中的实际余额

        //注释：王庆文 2020年12月11日=========================================================================
        //查询持卡人指定卡号的信用卡账户余额
        public string QueryUserBanlance(string strB64RequestData)
        {
            string strRtData = "{\"BANLANCE\":\"0.00\"}";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strDefUnitCode = "0000"; //当前平台单位编码
            string strPersonCode = "00000"; //APP用户的人员编码
            string strEnBankCardNo = "000"; //信用卡号码（密文）

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 3)
            {
                strDefUnitCode = strArray[0];
                strPersonCode = strArray[1];
                strEnBankCardNo = strArray[2];
            }

            #endregion

            //向信之队的支付通道发起信用卡虚拟账户余额查询请求，查看账户内的总余额数字
            clsCreditQuery myXzd = new clsCreditQuery(); //实例化数据库类
            string strBanlance = myXzd.queryUserBanlance(strDefUnitCode, strPersonCode, strEnBankCardNo);

            //clsRWFile myLog = new clsRWFile(); //将待执结果记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", strBanlance);

            strRtData = "{\"BANLANCE\":\"" + strBanlance + "\"}";

            return strRtData; //信用卡虚拟账户余额查询结果
        }

        #endregion




    }
}
